<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "https://www.w3.org/TR/html4/loose.dtd">
<html lang="zh-CN"><head><meta http-equiv="Content-Type" content="text/html; charset=utf-8"><meta http-equiv="Content-Language" content="zh-CN"><link href="stylesheet.css" media="all" rel="stylesheet" type="text/css">
<title>SET CONSTRAINTS</title>
<script> var _hmt = _hmt || []; (function() { var hm = document.createElement("script"); hm.src = "https://hm.baidu.com/hm.js?d286c55b63a3c54a1e43d10d4c203e75"; var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(hm, s); })(); </script>
</head><body class="REFENTRY">
<div>
<table summary="Header navigation table" width="100%" border="0" cellpadding="0" cellspacing="0">
<tr><th colspan="5" align="center" valign="bottom">PostgreSQL 8.2.3 中文文档</th></tr>
<tr><td width="10%" align="left" valign="top"><a href="sql-set.html" accesskey="P">后退</a></td><td width="10%" align="left" valign="top"><a href="sql-set.html">快退</a></td><td width="60%" align="center" valign="bottom"></td><td width="10%" align="right" valign="top"><a href="sql-set-role.html">快进</a></td><td width="10%" align="right" valign="top"><a href="sql-set-role.html" accesskey="N">前进</a></td></tr>
</table>
<hr align="LEFT" width="100%"></div>
<h1><a name="SQL-SET-CONSTRAINTS"></a>SET CONSTRAINTS</h1>
<div class="REFNAMEDIV"><a name="AEN54471"></a><h2>名称</h2>SET CONSTRAINTS&nbsp;--&nbsp;设置当前事务的约束检查模式</div>
<a name="AEN54474"></a>
<div class="REFSYNOPSISDIV"><a name="AEN54476"></a><h2>语法</h2>
<pre class="SYNOPSIS">SET CONSTRAINTS { ALL | <tt class="REPLACEABLE"><i>name</i></tt> [, ...] } { DEFERRED | IMMEDIATE }</pre>
</div>
<div class="REFSECT1"><a name="AEN54479"></a><h2>描述</h2>
<p><tt class="COMMAND">SET CONSTRAINTS</tt> 设置当前事务里的约束检查的特性。<tt class="LITERAL">IMMEDIATE</tt> 约束是在每条语句后面进行检查。<tt class="LITERAL">DEFERRED</tt> 约束一直到事务提交时才检查。每个约束都有自己的 <tt class="LITERAL">IMMEDIATE</tt> 或 <tt class="LITERAL">DEFERRED</tt> 模式。</p>
<p>从创建的时候开始，一个约束总是给定为 <tt class="LITERAL">DEFERRABLE INITIALLY DEFERRED</tt>, <tt class="LITERAL">DEFERRABLE INITIALLY IMMEDIATE</tt>, <tt class="LITERAL">NOT DEFERRABLE</tt> 三个特性之一。第三种总是 <tt class="LITERAL">IMMEDIATE</tt> ，并且不会受 <tt class="COMMAND">SET CONSTRAINTS</tt> 影响。头两种以指定的方式启动每个事务，但是他们的行为可以在事务里用 <tt class="COMMAND">SET CONSTRAINTS</tt> 改变。</p>
<p>带着一个约束名列表的 <tt class="COMMAND">SET CONSTRAINTS</tt> 改变这些约束的模式(都必须是可推迟的)。如果有多个约束匹配某个名字，那么所有都会被影响。<tt class="COMMAND">SET CONSTRAINTS ALL</tt> 改变所有可推迟约束的模式。</p>
<p>当 <tt class="COMMAND">SET CONSTRAINTS</tt> 把一个约束从 <tt class="LITERAL">DEFERRED</tt> 改成 <tt class="LITERAL">IMMEDIATE</tt> 的时候，新模式反作用式地起作用：任何将在事务结束准备进行的数据修改都将在 <tt class="COMMAND">SET CONSTRAINTS</tt> 的时候执行检查。如果违反了任何约束，<tt class="COMMAND">SET CONSTRAINTS</tt> 都会失败(并且不会修改约束模式)。因此，<tt class="COMMAND">SET CONSTRAINTS</tt> 可以用于强制在事务中某一点进行约束检查。</p>
<p>目前，只有外键约束被这个设置影响。检查和唯一约束总是不可推迟的。</p>
</div>
<div class="REFSECT1"><a name="AEN54505"></a><h2>注意</h2>
<p>这个命令只在当前事务里修改约束的行为。因此，如果你在事务块之外(<tt class="COMMAND">BEGIN</tt>/<tt class="COMMAND">COMMIT</tt> 对)执行这个命令，它将没有任何作用。</p>
</div>
<div class="REFSECT1"><a name="AEN54510"></a><h2>兼容性</h2>
<p>这条命令与 SQL 标准里定义的行为兼容，只不过，在 PostgreSQL 里，它只适用于外键约束。</p>
</div>
<div>
<hr align="LEFT" width="100%">
<table summary="Footer navigation table" width="100%" border="0" cellpadding="0" cellspacing="0">
<tr><td width="33%" align="left" valign="top"><a href="sql-set.html" accesskey="P">后退</a></td><td width="34%" align="center" valign="top"><a href="index.html" accesskey="H">首页</a></td><td width="33%" align="right" valign="top"><a href="sql-set-role.html" accesskey="N">前进</a></td></tr>
<tr><td width="33%" align="left" valign="top">SET</td><td width="34%" align="center" valign="top"><a href="sql-commands.html" accesskey="U">上一级</a></td><td width="33%" align="right" valign="top">SET ROLE</td></tr>
</table>
</div>
</body></html>